//package service;
//
//
//import java.io.*;
//import java.nio.charset.StandardCharsets;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.concurrent.locks.Lock;
//import java.util.concurrent.locks.ReentrantLock;
//
//public class WriteAheadLog {
//    private static final long MAX_LOG_FILE_SIZE = 100; // 最大日志文件大小
//    private final String logDirectory;
//    private BufferedWriter logWriter;
//    private File currentLogFile;
//    private final Lock writeLock = new ReentrantLock(); // 写入锁
//
//    public WriteAheadLog() throws IOException {
//        this.logDirectory = logDirectory;
//        this.memTable = memTable;
//        File dir = new File(logDirectory);
//        if (!dir.exists()) {
//            dir.mkdirs(); // 如果日志目录不存在，则创建
//        }
//        rotateLogFile(); // 轮转到一个新的日志文件
//    }
//
//    // 轮转日志文件的方法
//    private void rotateLogFile() throws IOException {
//        writeLock.lock(); // 在轮转期间持有写锁
//        try {
//            if (logWriter != null) {
//                logWriter.flush(); // 刷新当前日志文件的写入器
//                logWriter.close(); // 关闭当前日志文件的写入器
//            }
//            // 创建一个新的日志文件，文件名格式为 "wal_时间戳.log"
//            currentLogFile = new File(logDirectory, "wal_" + System.currentTimeMillis() + ".log");
//            // 初始化新的日志文件写入器
//            logWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(currentLogFile, true), StandardCharsets.UTF_8));
//        } finally {
//            writeLock.unlock(); // 释放锁
//        }
//    }
//
//    // 记录操作到日志文件
//    private void logOperation(String operation, String key, String value) throws IOException {
//        writeLock.lock(); // 加锁
//        try {
//            checkLogFileSize(); // 检查日志文件大小是否需要轮转
//            logWriter.write(operation + " " + key + (value != null ? " " + value : "")); // 写入操作
//            logWriter.newLine(); // 换行
//            logWriter.flush(); // 刷新缓冲区
//        } finally {
//            writeLock.unlock(); // 释放锁
//        }
//    }
//
//    // 记录PUT操作到日志文件
//    public void logWrite(String key, String value) throws IOException {
//        logOperation("PUT", key, value);
//    }
//
//    // 记录DELETE操作到日志文件
//    public void logDelete(String key) throws IOException {
//        logOperation("DELETE", key, null);
//    }
//
//    // 检查日志文件大小，如果超过最大限制则轮转日志文件
//    private void checkLogFileSize() throws IOException {
//        if (currentLogFile != null && currentLogFile.length() >= MAX_LOG_FILE_SIZE) {
//            rotateLogFile(); // 轮转到新的日志文件
//        }
//    }
//
//    // 关闭日志文件写入器
//    public void close() throws IOException {
//        writeLock.lock(); // 加锁
//        try {
//            if (logWriter != null) {
//                logWriter.flush();
//                logWriter.close(); // 关闭当前日志文件的写入器
//            }
//        } finally {
//            writeLock.unlock(); // 释放锁
//        }
//    }
//
//    // 获取日志目录中所有的日志文件
//    public List<File> getLogFiles() {
//        File dir = new File(logDirectory);
//        // 过滤出所有以 "wal_" 开头并以 ".log" 结尾的文件
//        File[] files = dir.listFiles((d, name) -> name.startsWith("wal_") && name.endsWith(".log"));
//        List<File> logFiles = new ArrayList<>();
//        if (files != null) {
//            for (File file : files) {
//                logFiles.add(file); // 添加到日志文件列表中
//            }
//        }
//        return logFiles;
//    }
//
//    // 解析WAL日志文件并将操作回放到MemTable
//    public void replay(MemTable memTable) throws IOException {
//        WriteAheadLog writeAheadLog = new WriteAheadLog();
//        List<File> logFiles = getLogFiles(); // 获取所有日志文件
//        for (File logFile : logFiles) {
//            try (BufferedReader logReader = new BufferedReader(new InputStreamReader(new FileInputStream(logFile), StandardCharsets.UTF_8))) {
//                String line;
//                while ((line = logReader.readLine()) != null) {
//                    String[] parts = line.split(" ", 3); // 分割日志行
//                    if (parts.length >= 2) {
//                        String command = parts[0]; // 操作类型（PUT或DELETE）
//                        String key = parts[1]; // 键
//                        if ("PUT".equals(command) && parts.length == 3) {
//                            String value = parts[2]; // 值
//                            memTable.put(key, value); // 回放PUT操作
//                        } else if ("DELETE".equals(command)) {
//                            memTable.remove(key); // 回放DELETE操作
//                        }
//                    }
//                }
//            }
//        }
//    }
//}
